class RequestManager {
	constructor() {
		this.idMap = new Map()
	}
	/**
	 * 生成唯一ID，并将ID和请求信息存储到map对象中
	 * @param {string} method - 请求方法
	 * @param {string} url - 请求URL
	 * @param {object} params - 请求参数
	 * @returns {string|boolean} - 生成的唯一ID，如果存在相同请求则返回false
	 */
	generateId(method, url, params) {
		const id = this.generateUniqueId(method, url, params)
		if (this.idMap.has(id)) {
			return false
		}
		this.idMap.set(id, {
			method,
			url,
			params
		})
		return id
	}

	/**
	 * 根据ID删除map对象中的请求信息
	 * @param {string} id - 要删除的唯一ID
	 */
	deleteById(id) {
		this.idMap.delete(id)
	}

	/**
	 * 生成唯一ID的方法
	 * @param {string} method - 请求方法
	 * @param {string} url - 请求URL
	 * @param {object} params - 请求参数
	 * @returns {string} - 生成的唯一ID
	 */
	generateUniqueId(method, url, params) {
		const idString = `${method}-${url}-${this.serializeObject(params)}`
		let id = 0;
		for (let i = 0; i < idString.length; i++) {
			id = ((id << 5) - id) + idString.charCodeAt(i)
			id |= 0;
		}
		return id.toString()
	}

	/**
	 * 序列化对象为字符串
	 * @param {object} obj - 要序列化的对象
	 * @returns {string} - 序列化后的字符串
	 */
	serializeObject(obj) {
		const keys = Object.keys(obj).sort()
		const serializedObj = {}
		for (let key of keys) {
			const value = obj[key]
			if (value !== null && typeof value === 'object') {
				serializedObj[key] = this.serializeObject(value)
			} else {
				serializedObj[key] = value
			}
		}
		return JSON.stringify(serializedObj)
	}
}

export default RequestManager